<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    闭包是什么
        闭包是一个函数嵌套函数，
    为什么会有闭包
        因为作用域有全局，函数。
        作用域链是，从内到外可以一层层访问，但是反之则不可。
        那么我们在函数的里面再通过一个函数去访问，然后返回到外部就可以访问了。
        函数的内部变量，外部无法访问。所以可以通过闭包解决。
        
    闭包有什么作用
       可以声明私有化变量，然后暴露出接口让其外部调用。
    闭包有什么问题
    内存泄漏：闭包里的变量一旦声明了，会一直保存在内存，需要主动销毁。否则影响性能
    应用：防抖节流
    <script>
       // 场景1：
        // 外部想访问函数内部的变量
        // 通过闭包返回出去

        // 当我想改变或者获取某个函数里面的变量时，使用闭包是个办法

        function foo(){
            let name='kevin'
            // 闭包
            const setName=function(str){
                name=str
            };
            // 闭包
            const getName=function(){
                return name;
            }

            return {
                setName,
                getName
            }
        }
        const foo1=foo();
        foo1.setName('hah');
        
        console.log(foo1,foo1.getName())

//         　var name = "The Window";

// 　　var object = {
// 　　　　name : "My Object",

// 　　　　getNameFunc : function(){
//             console.log(this)//"My Object"
// 　　　　　　return function(){
//                 console.log(this)//"The Window"
// 　　　　　　　　return this.name;//"The Window"
// 　　　　　　};

// 　　　　}

// 　　};
// console.log(object.getNameFunc()())

    // 经典案例
    // var i=0;
   
    // const show=function(){
    //     i++
    //     console.log(i)
    // }
    // for (let index = i; index < 5; index++) {
    //     show();
    // }
    // function hi(){
    //     i=0;
    // }
    // console.log(i)
    
    </script>
    <script>
        // 经典案例
        // for (var index = 1; index <= 3; index++) {
               
        //             setTimeout(function () {
        //                 console.log('after ' + index + ' second(s):' + index);
        //             }, index * 1000);
              
        //     }
        // 答案是
        // after 4 second(s):4
        // after 4 second(s):4
        // after 4 second(s):4
        //因为index 是公共的变量，如何把index保护起来？

        // 方式1
        let fun=function(index){
        console.log('after ' + index + ' second(s):' + index);
       }
        for (var index = 1; index <= 3; index++) {
                    setTimeout(fun(index), index * 1000);     
       }

       //方式2：闭包
      
        for (var index = 1; index <= 3; index++) {
                (function(index){
                    setTimeout(function () {
                        console.log('after ' + index + ' second(s):' + index);
                    }, index * 1000); 
                })(index)
                      
       }

       


    </script>
</body>
</html>